package thread;

import lombok.extern.slf4j.Slf4j;

/**
 * java中的线程状态。
 */

@Slf4j(topic = "c.ThreadStateTest")
public class ThreadStateTest {

    public static void main(String[] args) throws InterruptedException {
        //仅仅只是初始化一下，所以处于【NEW】状态。
        Thread t1 = new Thread("t1"){
            @Override
            public void run() {
                log.debug("running...");
            }
        };

        //调用了start方法，并且这是一个死循环，不会结束的线程，对应的状态为【Runnable】。
        Thread t2 =new Thread("t2"){
            @Override
            public void run() {
                while(true){

                }
            }
        };
        t2.start();

        //一个正常的多线程，该线程会结束，所以状态为【TERMINATED】。
        Thread t3= new Thread("t3"){
            @Override
            public void run() {
                log.debug("running...");
            }
        };
        t3.start();

        //sleep方法，对应的状态为【TIMED_WAITING】。
        Thread t4 = new Thread("t4"){
            @Override
            public void run() {
                synchronized (ThreadStateTest.class){
                    try{
                        Thread.sleep(10000);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                }
            }
        };
        t4.start();

        //调用join方法，会使得当前线程进入【WAITING】状态。
        Thread t5 = new Thread("t5"){
            @Override
            public void run() {
                try {
                    t2.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        t5.start();

        //该线程【t6】和【t4】获取的是同一个锁，所以他们的状态有一个为【TIMED_WAITING（执行了sleep的方法）】
        //【BLOCKED（没有获取到锁的线程）】。
        Thread t6 = new Thread("t6"){
            @Override
            public void run() {
                //同一个锁
                synchronized (ThreadStateTest.class){
                    try{
                        Thread.sleep(10000);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                }
            }
        };
        t6.start();

        Thread.sleep(100);

        log.debug("t1 state {}",t1.getState());
        log.debug("t2 state {}",t2.getState());
        log.debug("t3 state {}",t3.getState());
        log.debug("t4 state {}",t4.getState());
        log.debug("t5 state {}",t5.getState());
        log.debug("t6 state {}",t6.getState());
    }
}
